package drds.server.sqlparser.visitor;

import drds.server.sqlparser.sqlobject.SqlObject;
import drds.server.sqlparser.sqlobject.expression.$List;
import drds.server.sqlparser.sqlobject.expression.AggregateFunction;
import drds.server.sqlparser.sqlobject.expression.AllColumn;
import drds.server.sqlparser.sqlobject.expression.Between;
import drds.server.sqlparser.sqlobject.expression.BetweenWithPartitionKey;
import drds.server.sqlparser.sqlobject.expression.InList;
import drds.server.sqlparser.sqlobject.expression.InListWithpartitionKey;
import drds.server.sqlparser.sqlobject.expression.Not;
import drds.server.sqlparser.sqlobject.expression.Variable;
import drds.server.sqlparser.sqlobject.expression.binary.BinaryExpression;
import drds.server.sqlparser.sqlobject.expression.data_type.Null;
import drds.server.sqlparser.sqlobject.expression.data_type.Text;
import drds.server.sqlparser.sqlobject.expression.data_type.number.Decimal;
import drds.server.sqlparser.sqlobject.expression.data_type.number.Int;
import drds.server.sqlparser.sqlobject.expression.name.Identifier;
import drds.server.sqlparser.sqlobject.expression.name.TableAliasName$ColumnName;
import drds.server.sqlparser.sqlobject.expression.unary.Unary;
import drds.server.sqlparser.sqlobject.statement.delete.DeleteStatement;
import drds.server.sqlparser.sqlobject.statement.insert.InsertStatement;
import drds.server.sqlparser.sqlobject.statement.insert.ValueList;
import drds.server.sqlparser.sqlobject.statement.query.GroupBy;
import drds.server.sqlparser.sqlobject.statement.query.Limit;
import drds.server.sqlparser.sqlobject.statement.query.Query;
import drds.server.sqlparser.sqlobject.statement.query.SelectItem;
import drds.server.sqlparser.sqlobject.statement.query.SelectStatement;
import drds.server.sqlparser.sqlobject.statement.query.SubQuery;
import drds.server.sqlparser.sqlobject.statement.query.order_by.OrderBy;
import drds.server.sqlparser.sqlobject.statement.query.order_by.OrderByItem;
import drds.server.sqlparser.sqlobject.statement.query.union_query.UnionQuery;
import drds.server.sqlparser.sqlobject.statement.query.union_query.UnionQueryTable;
import drds.server.sqlparser.sqlobject.statement.table.ExpressionTable;
import drds.server.sqlparser.sqlobject.statement.table.JoinTable;
import drds.server.sqlparser.sqlobject.statement.update.UpdateSetItem;
import drds.server.sqlparser.sqlobject.statement.update.UpdateStatement;

/**
 * 
 * @author 曹正辉<330937205@qq.com>
 * 
 */
public interface Visitor {
	/**
	 * crud
	 */

	//
	boolean visit(InsertStatement x);

	void endVisit(InsertStatement x);

	//

	boolean visit(UpdateStatement x);

	void endVisit(UpdateStatement x);

	//

	boolean visit(UpdateSetItem x);

	void endVisit(UpdateSetItem x);

	//
	boolean visit(DeleteStatement x);

	void endVisit(DeleteStatement x);

	//

	boolean visit(SelectStatement x);

	void endVisit(SelectStatement x);

	//
	boolean visit(SelectItem x);

	void endVisit(SelectItem x);

	//
	boolean visit(GroupBy x);

	void endVisit(GroupBy x);

	//

	boolean visit(OrderBy x);

	void endVisit(OrderBy x);

	//

	boolean visit(OrderByItem x);

	void endVisit(OrderByItem x);

	boolean visit($List x);

	void endVisit($List x);

	//
	boolean visit(AggregateFunction aggregateFunction);

	void endVisit(AggregateFunction aggregateFunction);

	//

	boolean visit(AllColumn x);

	void endVisit(AllColumn x);

	//
	boolean visit(Between x);

	void endVisit(Between x);

	//
	boolean visit(BinaryExpression x);

	void endVisit(BinaryExpression x);

	//
	boolean visit(Identifier x);

	void endVisit(Identifier x);

	//
	boolean visit(InList x);

	void endVisit(InList x);

	/**
	 * 数据
	 */
	//
	boolean visit(Int x);

	void endVisit(Int x);

	//
	boolean visit(Decimal x);

	void endVisit(Decimal x);

	//

	boolean visit(TableAliasName$ColumnName x);

	void endVisit(TableAliasName$ColumnName x);

	//
	/**
	 * table
	 */
	//
	boolean visit(ExpressionTable x);

	void endVisit(ExpressionTable x);

	//
	boolean visit(JoinTable x);

	void endVisit(JoinTable x);

	//

	boolean visit(UnionQueryTable x);

	void endVisit(UnionQueryTable x);

	//

	//
	boolean visit(Limit x);

	void endVisit(Limit x);

	//

	boolean visit(Not x);

	void endVisit(Not x);

	//

	boolean visit(Null x);

	void endVisit(Null x);

	//

	boolean visit(Query x);

	void endVisit(Query x);

	//

	boolean visit(SubQuery x);

	void endVisit(SubQuery x);

	//

	boolean visit(ValueList x);

	void endVisit(ValueList x);

	//

	boolean visit(Variable x);

	void endVisit(Variable x);

	//

	boolean visit(Text x);

	void endVisit(Text x);

	//

	boolean visit(Unary x);

	void endVisit(Unary x);

	//

	boolean visit(UnionQuery x);

	void endVisit(UnionQuery x);

	//

	void preVisit(SqlObject x);

	void postVisit(SqlObject x);

	//

	boolean visit(BetweenWithPartitionKey betweenWithPartitionKey);

	void endVisit(BetweenWithPartitionKey betweenWithPartitionKey);

	boolean visit(InListWithpartitionKey inListWithpartitionKey);

	void endVisit(InListWithpartitionKey inListWithpartitionKey);

}
